import os
from functools import cache
from typing import Optional

from loguru import logger
from qcloud_cos import CosConfig, CosS3Client

from app.core.config import settings


class CosManager:
    """腾讯云COS对象存储管理类 (单例模式封装)"""

    def __init__(self):
        self.region = settings.COS_REGION
        self.bucket_name = settings.COS_BUCKET_NAME

    @property
    @cache  # 核心：使用缓存确保同一配置只创建一个客户端
    def client(self) -> CosS3Client:
        """获取COS客户端实例 (单例)"""
        secret_id = settings.COS_SECRET_ID
        secret_key = settings.COS_SECRET_KEY

        if not all([secret_id, secret_key]):
            raise ValueError("腾讯云COS密钥信息未在环境变量中配置完整")

        config = CosConfig(
            Region=self.region,
            SecretId=secret_id,
            SecretKey=secret_key
        )

        # 创建并返回客户端实例
        # 注意：CosS3Client内部可能已维护连接池，我们确保其单例即可
        return CosS3Client(config)

    def upload_audio_bytes(
            self,
            file_bytes: bytes,
            key: str,
            content_type: str = 'audio/mpeg'
    ) -> str:
        """
        上传音频文件到COS

        Args:
            file_bytes: 音频文件的字节数据
            key: 在COS中存储的文件路径，如 'audios/20240520/abc123.mp3'
            content_type: 文件MIME类型，默认audio/mpeg

        Returns:
            可公开访问的音频文件URL
        """
        try:
            #### 字节流简单上传
            response = self.client.put_object(
                Bucket=self.bucket_name,
                Body=file_bytes,
                Key=key,
                # ContentType=content_type,
                EnableMD5=False
            )
            logger.debug(f"tencent cos response is:{response['ETag']}")

            # 构建文件的永久访问URL
            file_url = f"https://{self.bucket_name}.cos.{self.region}.myqcloud.com/{key}"
            return file_url

        except Exception as e:
            # 在实际项目中应使用更精细的异常处理
            logger.error(f"上传文件到COS失败: {str(e)}")
            raise  # 重新抛出异常，让上层处理


# 创建全局单例管理器实例
cos_manager = CosManager()